package com.cskaoyan.aspect;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;

/**
 * @author stone
 * @date 2022/10/04 11:08
 */
@Component
public class CustomAspect {

    public void serviceBefore() {
        System.out.println("Before通知在委托类方法执行之前会调用到");
    }

    public void serviceAfter() {
        System.out.println("After通知对应的方法，类似于try-catch中的finally");
    }

    // 返回值 作为代理对象执行方法的返回值
    // JoinPoint连接点 → 获得通知执行过程中的一些特殊的值
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("around通知在委托类方法执行之 →前← 执行的内容");
        Object proceed = joinPoint.proceed();
        System.out.println("around通知在委托类方法执行之 →后← 执行的内容");

        return proceed;
    }

    // afterReturning通知传入一个Object类型的形参，用来接收委托类方法返回的结果
    public void afterReturning(Object result) {
        System.out.println("在return之后执行，并且可以获得return的结果：" + result);
    }

    //afterThrowing通知传入一个Exception（或Throwable）类型的形参，用来接收委托类方法抛出的异常
    public void afterThrowing(Exception exception) {
        System.out.println("在抛出异常之后执行，并且可以获得抛出的异常对象：" + exception.getMessage());
    }
}
